{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据预处理",
   "id": "21fcb9264af09b53"
  },
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-06-09T10:32:31.664420Z",
     "start_time": "2024-06-09T10:32:29.613838Z"
    }
   },
   "source": [
    "import Config\n",
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn import metrics\n",
    "import matplotlib.pyplot as plt\n",
    "import joblib\n",
    "\n",
    "healthcare_data = pd.read_csv(\"../../data/healthcare-dataset-stroke-data.csv\")\n",
    "healthcare_data = healthcare_data.dropna()\n",
    "del healthcare_data['id']\n",
    "# 性别热编码\n",
    "gender_list = healthcare_data['gender']\n",
    "gender_hot = pd.get_dummies(gender_list)\n",
    "# 婚姻热编码\n",
    "ever_married_list = healthcare_data['ever_married']\n",
    "ever_married_hot = pd.get_dummies(ever_married_list)\n",
    "# 工作热编码\n",
    "work_type_list = healthcare_data['work_type']\n",
    "work_type_hot = pd.get_dummies(work_type_list)\n",
    "# 居住热编码\n",
    "residence_type_list = healthcare_data['Residence_type']\n",
    "residence_type_hot = pd.get_dummies(residence_type_list)\n",
    "# 吸烟热编码\n",
    "smoking_status_list = healthcare_data['smoking_status']\n",
    "smoking_status_hot = pd.get_dummies(smoking_status_list)\n",
    "\n",
    "del healthcare_data['gender'], healthcare_data['ever_married'], healthcare_data['work_type'], healthcare_data['Residence_type'], healthcare_data['smoking_status']\n",
    "\n",
    "healthcare_data = pd.concat([healthcare_data, gender_hot, ever_married_hot, work_type_hot, residence_type_hot, smoking_status_hot],axis=1)\n",
    "\n",
    "# X是特征矩阵，y是目标变量\n",
    "X, y = healthcare_data.drop('stroke', axis=1), healthcare_data['stroke']\n",
    "\n",
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
    "scaler = StandardScaler()\n",
    "print(X_train)\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_test = scaler.transform(X_test)\n",
    "# healthcare_data"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "        age  hypertension  heart_disease  avg_glucose_level   bmi  Female  \\\n",
      "1473  49.00             1              0             139.43  40.2   False   \n",
      "4539  63.00             0              0             203.87  26.4    True   \n",
      "953    6.00             0              0              92.98  18.9   False   \n",
      "2563  57.00             0              0              90.40  26.5   False   \n",
      "2426   7.00             0              0              79.58  15.5    True   \n",
      "...     ...           ...            ...                ...   ...     ...   \n",
      "1939  33.00             0              0              57.92  22.3    True   \n",
      "757   19.00             0              0              84.31  31.8   False   \n",
      "5024  33.00             0              0             153.34  31.5   False   \n",
      "1853  55.00             0              0             198.36  29.1    True   \n",
      "1808   0.64             0              0              62.27  17.3    True   \n",
      "\n",
      "       Male  Other     No    Yes  ...  Never_worked  Private  Self-employed  \\\n",
      "1473   True  False  False   True  ...         False    False          False   \n",
      "4539  False  False  False   True  ...         False    False           True   \n",
      "953    True  False   True  False  ...         False    False          False   \n",
      "2563   True  False  False   True  ...         False     True          False   \n",
      "2426  False  False   True  False  ...         False    False          False   \n",
      "...     ...    ...    ...    ...  ...           ...      ...            ...   \n",
      "1939  False  False  False   True  ...         False    False          False   \n",
      "757    True  False   True  False  ...         False     True          False   \n",
      "5024   True  False  False   True  ...         False     True          False   \n",
      "1853  False  False  False   True  ...         False    False          False   \n",
      "1808  False  False   True  False  ...         False    False          False   \n",
      "\n",
      "      children  Rural  Urban  Unknown  formerly smoked  never smoked  smokes  \n",
      "1473     False  False   True    False             True         False   False  \n",
      "4539     False   True  False    False            False          True   False  \n",
      "953       True   True  False     True            False         False   False  \n",
      "2563     False  False   True    False            False          True   False  \n",
      "2426      True  False   True     True            False         False   False  \n",
      "...        ...    ...    ...      ...              ...           ...     ...  \n",
      "1939     False   True  False     True            False         False   False  \n",
      "757      False   True  False    False            False          True   False  \n",
      "5024     False   True  False    False            False          True   False  \n",
      "1853     False  False   True    False            False         False    True  \n",
      "1808      True  False   True     True            False         False   False  \n",
      "\n",
      "[3927 rows x 21 columns]\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-03T10:30:47.587353Z",
     "start_time": "2024-06-03T10:30:47.573543Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(scaler, '../health_models/health_scaler_model.pkl')"
   ],
   "id": "8c17c23e2920b447",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['../health_models/health_scaler_model.pkl']"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 逻辑回归模型",
   "id": "93d0bfa44295c291"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:16.821268Z",
     "start_time": "2024-05-31T00:16:16.694534Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 逻辑回归模型\n",
    "\n",
    "model = LogisticRegression(solver='liblinear')\n",
    "model.fit(X_train, y_train)\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "c43e3cd869921e4e",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[940   0]\n",
      " [ 42   0]]\n",
      "0.9572301425661914\n",
      "0.0\n",
      "0.0\n",
      "0.0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "H:\\Python\\PythonProject\\marchingproject\\.venv\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1517: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABEmElEQVR4nO3deVyU9f7//8cMMMMi4IKAC+5rLiyapOXxWJwsy7JVpY9Zpz1QkzYt08xST5m5QHlOy6nz+4hrWpamFeUpy7IE3HFfcAHFBRBkm7l+f5xvnA+lBQpczPC8325zu8XFdTnPeYfM0+t1zYzFMAwDERERETdhNTuAiIiISHVSuRERERG3onIjIiIibkXlRkRERNyKyo2IiIi4FZUbERERcSsqNyIiIuJWPM0OUNucTifHjh3D398fi8VidhwRERGpBMMwyM/Pp3nz5litv39upt6Vm2PHjhEWFmZ2DBEREbkEmZmZtGzZ8nf3qXflxt/fH/jP4gQEBJicRkRERCojLy+PsLCw8ufx31Pvys0vo6iAgACVGxERERdTmUtKdEGxiIiIuBWVGxEREXErKjciIiLiVlRuRERExK2o3IiIiIhbUbkRERERt6JyIyIiIm5F5UZERETcisqNiIiIuBWVGxEREXErppabb775hiFDhtC8eXMsFgsfffTRHx6zbt06oqKisNvtdOjQgffff7/Gc4qIiIjrMLXcFBQUEB4eTlJSUqX2P3DgADfddBMDBw4kPT2dJ554ggcffJC1a9fWcFIRERFxFaZ+cOaNN97IjTfeWOn958+fT9u2bXn99dcB6Nq1K+vXr+eNN95g0KBBNRVTREREKmnToTO0aeJLkwZ20zK41DU3GzZsICYmpsK2QYMGsWHDhoseU1xcTF5eXoWbiIiIVC+n02D+v/dx99838OTSzTidhmlZXKrcZGVlERISUmFbSEgIeXl5nD9//oLHTJ8+ncDAwPJbWFhYbUQVERGpN06dK+avH/zEjM8ycDgN/L29KHE4TcvjUuXmUkyYMIHc3NzyW2ZmptmRRERE3MaP+08xeO63rNt1Erunlem392Du8Ai8vTxMy2TqNTdVFRoaSnZ2doVt2dnZBAQE4OPjc8Fj7HY7drt5cz8RERF35HAavPn1Xt74cjdOA9o19SMpNoquzQLMjuZa5aZv376sXr26wrYvvviCvn37mpRIRESk/jmZX8y4xems35sDwO2RLZg6tDt+9rpRK0xNce7cOfbu3Vv+9YEDB0hPT6dx48a0atWKCRMmcPToUf71r38B8Oijj5KYmMgzzzzDX//6V7766iuWLFnCqlWrzHoIIiIi9cr3e3MYuzidk/nFeHtZmXprd+7qXbeuZzW13Pz8888MHDiw/OuEhAQARo0axfvvv8/x48c5fPhw+ffbtm3LqlWrGDduHHPmzKFly5a88847ehm4iIhIDXM4Deak7GHeV3swDOgU0oCk2Cg6hvibHe03LIZhmPdaLRPk5eURGBhIbm4uAQHmzwVFRETquuy8IsYuSuOH/acBuLt3S6bc0h0fW+1dNFyV5++6MRwTERGROumb3ScZtzidUwUl+No8eOW27twW2dLsWL9L5UZERER+o8zh5I0vd/Pmun0YBnQJ9SfpnijaN21gdrQ/pHIjIiIiFRzPPc+YhWn8dPAMAPdEt+KFm68w9b1rqkLlRkRERMp9nXGChCXpnCkspYHdk+m392BIeHOzY1WJyo2IiIhQ6nAyc+0u/v7NfgC6twggcUQUbYL8TE5WdSo3IiIi9dyRM4WMXphG2uGzANzXrw0TBnfB7ukaY6hfU7kRERGpxz7fnsXTy7aQe74Uf29PXruzJzd0b2Z2rMuiciMiIlIPlZQ5mf7ZTv753UEAwlsGkhgbRVhjX3ODVQOVGxERkXrm8KlC4hemsuVILgAPXNOWZ2/ogs3TanKy6qFyIyIiUo98tvU4zyzbQn5xGYE+Xsy8K5y/XBFidqxqpXIjIiJSDxSVOpi2eif/2nAIgKhWDZkXG0WLhj4mJ6t+KjciIiJu7kBOAfHJqWw/lgfAIwPa8dT1nfHycI8x1K+p3IiIiLixlZuP8dzyrZwrLqOxn43X7w5nYOdgs2PVKJUbERERN1RU6mDKJztYuPEwAH3aNGbuiEhCA71NTlbzVG5ERETczN4T54hPTiUjKx+LBeIHdmDsdR3xdNMx1K+p3IiIiLiR5alHmPjRNgpLHAQ1sPHGsAj6d2xqdqxapXIjIiLiBgpLypj88XaWbjoCQN92TZgzPILgAPcfQ/2ayo2IiIiL252dT9yCVPacOIfFAmOv68joazviYbWYHc0UKjciIiIuyjAMlv58hEkrt1FU6qSpv505wyPo1z7I7GimUrkRERFxQQXFZUz8aBsr0o4C0L9jEG8MiyCogd3kZOZTuREREXExO4/nEbcglf05BVgt8OT1nXlsQHus9XQM9WsqNyIiIi7CMAySNx5myic7KClzEhrgzdwRkfRp29jsaHWKyo2IiIgLyC8qZcLyrXy65TgAAzs35fW7I2jsZzM5Wd2jciMiIlLHbTuaS3xyKgdPFeJptfD0oM481L+dxlAXoXIjIiJSRxmGwb82HOKVVTspcThp0dCHuSMi6dW6kdnR6jSVGxERkToo93wp4z/cwmfbsgCI6RrCzLt60tBXY6g/onIjIiJSx6RnniU+OZUjZ87j5WFh/I1d+evVbbBYNIaqDJUbERGROsIwDN5df4C/rcmg1GEQ1tiHxBFRhIc1NDuaS1G5ERERqQPOFpbw1NItfLkzG4Abu4cy446eBPp4mZzM9ajciIiImGzToTOMTk7lWG4RNg8rE2/uysirWmsMdYlUbkREREzidBr849v9vLZ2Fw6nQZsmviTGRtG9RaDZ0Vyayo2IiIgJTheUkLAknXW7TgIwJLw5027rjr+3xlCXS+VGRESklm08cJoxC9PIyivC7mll8pBujOgTpjFUNVG5ERERqSVOp8Gb6/Yy64vdOA1o19SPpNgoujYLMDuaW1G5ERERqQUn84tJWJLOt3tyALg9sgVTh3bHz66n4uqmFRUREalh3+/LYeyidE7mF+PtZeWlW7tzV6+WGkPVEJUbERGRGuJwGsz7ag9zU/bgNKBjcAOS7omiU4i/2dHcmsqNiIhIDTiRV8TYRels2H8KgLt7t2TKLd3xsXmYnMz9qdyIiIhUs2/3nGTc4nRyzpXga/Pg5aHduT2qpdmx6g2VGxERkWpS5nAy+8s9JK3bi2FAl1B/EmOj6BDcwOxo9YrKjYiISDU4nnuesQvT2XjwNACx0a2YdPMVeHtpDFXbVG5EREQu09cZJ0hYks6ZwlIa2D2ZdnsPbglvbnasekvlRkRE5BKVOpzMXLuLv3+zH4BuzQNIio2iTZCfycnqN5UbERGRS3D07HlGJ6eSevgsAKP6tmbC4K4aQ9UBKjciIiJV9MWObJ5aupnc86X4e3vy6h09ubFHM7Njyf+jciMiIlJJJWVO/rYmg3fXHwAgvGUg80ZE0aqJr8nJ5P9SuREREamEzNOFxCensvlILgB/vbot42/sgs3TanIy+TWVGxERkT+wZttxnl62hfyiMgJ9vJh5Vzh/uSLE7FhyESo3IiIiF1FU6mD66p18sOEQAFGtGjJ3RCQtG2kMVZep3IiIiFzAwZwC4pJT2X4sD4BHBrTjqes74+WhMVRdp3IjIiLyK59sPsaE5Vs5V1xGI18vZt0dwcAuwWbHkkpSuREREfl/ikodvPTpDpJ/PAzAlW0aMXdEJM0CfUxOJlWhciMiIgLsO3mOuAWpZGTlY7FA3J878ERMRzw1hnI5KjciIlLvrUg7wvMrtlFY4qCJn43ZwyPo37Gp2bHkEqnciIhIvXW+xMHkldtY8vMRAPq2a8Kc4REEB3ibnEwuh8qNiIjUS3uy83l8QSp7TpzDYoEx13ZkzHUd8bBazI4ml0nlRkRE6hXDMFi66QiTPt5GUamTpv525gyLoF+HILOjSTUx/SqppKQk2rRpg7e3N9HR0WzcuPF39589ezadO3fGx8eHsLAwxo0bR1FRUS2lFRERV1ZQXMaTSzbzzLItFJU66d8xiNVj+qvYuBlTz9wsXryYhIQE5s+fT3R0NLNnz2bQoEHs2rWL4ODfvp9AcnIy48eP57333qNfv37s3r2b++67D4vFwqxZs0x4BCIi4ip2Hs8jPjmVfScLsFrgyes789iA9lg1hnI7FsMwDLPuPDo6miuvvJLExEQAnE4nYWFhjB49mvHjx/9m//j4eHbu3ElKSkr5tieffJIff/yR9evXX/A+iouLKS4uLv86Ly+PsLAwcnNzCQgIqOZHJCIidY1hGCzcmMmUT7ZTXOYkNMCbuSMi6dO2sdnRpAry8vIIDAys1PO3aWOpkpISNm3aRExMzH/DWK3ExMSwYcOGCx7Tr18/Nm3aVD662r9/P6tXr2bw4MEXvZ/p06cTGBhYfgsLC6veByIiInVWflEpYxal89yKrRSXOflz56asHttfxcbNmTaWysnJweFwEBJS8VNVQ0JCyMjIuOAxsbGx5OTkcM0112AYBmVlZTz66KM899xzF72fCRMmkJCQUP71L2duRETEvW07mkt8cioHTxXiYbXwzKDOPNS/ncZQ9YDpFxRXxbp165g2bRpvvvkmqampLF++nFWrVjF16tSLHmO32wkICKhwExER92UYBv/acJDb3/yeg6cKaR7ozZJH+vKIrq+pN0w7cxMUFISHhwfZ2dkVtmdnZxMaGnrBY1544QVGjhzJgw8+CECPHj0oKCjg4Ycf5vnnn8dqdamuJiIi1Sz3fCkTlm9h9dYsAGK6hjDzrp409LWZnExqk2ltwGaz0atXrwoXBzudTlJSUujbt+8FjyksLPxNgfHw8AD+09RFRKT+2px5lpvnfcvqrVl4eViYeFNX3r63l4pNPWTqS8ETEhIYNWoUvXv3pk+fPsyePZuCggLuv/9+AO69915atGjB9OnTARgyZAizZs0iMjKS6Oho9u7dywsvvMCQIUPKS46IiNQvhmHw3ncHmfHZTkodBi0b+ZAYG0VEWEOzo4lJTC03w4YN4+TJk0yaNImsrCwiIiJYs2ZN+UXGhw8frnCmZuLEiVgsFiZOnMjRo0dp2rQpQ4YM4ZVXXjHrIYiIiInOFpbw9LItfLHjP5c43NAtlL/d2ZNAHy+Tk4mZTH2fGzNU5XXyIiJSd6UePsPo5DSOnj2PzcPKxJu7MvKq1lgsumjYHVXl+VufLSUiIi7F6TR4+9v9vLZ2F2VOg9ZNfEmKjaJ7i0Czo0kdoXIjIiIu43RBCU8t3cxXGScAuLlnM6bf3gN/b42h5L9UbkRExCVsPHCaMQvTyMorwuZp5cUh3RjRJ0xjKPkNlRsREanTnE6Dt/69j1lf7MbhNGgX5EfSPVF0babrJuXCVG5ERKTOyjlXzLjF6Xy7JweA2yJb8PLQ7vjZ9fQlF6efDhERqZM27DvF2EVpnMgvxtvLyku3dOeu3i01hpI/pHIjIiJ1isNpMO+rPcxN2YPTgI7BDUi6J4pOIf5mRxMXoXIjIiJ1xon8Ip5YlM73+04BcFevlky5tRu+Nj1dSeXpp0VEROqE9XtyeGJxGjnnSvC1efDy0O7cHtXS7FjiglRuRETEVGUOJ7O/3EPSur0YBnQJ9ScxNooOwQ3MjiYuSuVGRERMk5VbxJhFaWw8cBqAEX1aMXnIFXh76cOQ5dKp3IiIiCm+3nWCJ5ds5nRBCX42D6bf0ZNbwpubHUvcgMqNiIjUqlKHk5mf7+Lv/94PQLfmASTGRtE2yM/kZOIuVG5ERKTWHD17njEL09h06AwA9/ZtzXODu2oMJdVK5UZERGrFlzuyeXLpZnLPl+Jv9+Rvd/ZkcI9mZscSN6RyIyIiNaqkzMmrazJ4Z/0BAHq2DCRxRBStmvianEzclcqNiIjUmMzThcQvTGNz5lkA/np1W8bf2AWbp9XcYOLWVG5ERKRGrNl2nKeXbSG/qIwAb09m3hXO9d1CzY4l9YDKjYiIVKviMgfTVu3kgw2HAIhs1ZB5IyJp2UhjKKkdKjciIlJtDuYUEL8wlW1H8wB45E/teGpQZ7w8NIaS2qNyIyIi1eLTLccY/+FWzhWX0cjXi9fvDufaLiFmx5J6SOVGREQuS1Gpg6mf7mDBj4cBuLJNI+aOiKRZoI/JyaS+UrkREZFLtu/kOeIWpJKRlY/FAo//uT3jYjrhqTGUmEjlRkRELslHaUd5bsVWCkscNPGz8cawCP7UqanZsURUbkREpGrOlzh4ceV2Fv+cCcBV7RozZ3gkIQHeJicT+Q+VGxERqbQ92fnEJaeyO/scFguMubYjY67riIfVYnY0kXIqNyIiUilLf85k0sfbOV/qoKm/nTnDIujXIcjsWCK/oXIjIiK/q6C4jBc+3sby1KMAXNMhiDeGRdDU325yMpELU7kREZGLysjKI25BKvtOFmC1QMJfOvH4nztg1RhK6jCVGxER+Q3DMFj0UyYvrtxOcZmTkAA7c4dHEt2uidnRRP6Qyo2IiFRwrriM55ZvZeXmYwAM6NSUWXeH06SBxlDiGlRuRESk3LajucQnp3LwVCEeVgtPD+rMw/3baQwlLkXlRkREMAyD//3hEFNX7aSkzEnzQG/mxUbSq3Vjs6OJVJnKjYhIPZdXVMr4D7ewemsWADFdg3ntznAa+dlMTiZyaVRuRETqsS1HzhKXnErm6fN4eVh49oYuPHBNWywWjaHEdanciIjUQ4Zh8M/vDjL9s52UOgxaNvIhMTaKiLCGZkcTuWwqNyIi9UxuYSlPL9vM5zuyAbihWyh/u7MngT5eJicTqR4qNyIi9Ujq4TOMTk7j6Nnz2DysPH9TV+7t21pjKHErKjciIvWA02nwzvr9vLpmF2VOg9ZNfEkcEUWPloFmRxOpdio3IiJu7kxBCU8u3cxXGScAuKlnM2bc3gN/b42hxD2p3IiIuLGfDp5mzMI0jucWYfO0MnnIFcT2aaUxlLg1lRsRETfkdBq89e99zPpiNw6nQbsgPxJjo7iieYDZ0URqnMqNiIibyTlXTMKSzXyz+yQAQyOa8/JtPWhg1698qR/0ky4i4kZ+2H+KMQvTOJFfjLeXlZdu6c5dvVtqDCX1isqNiIgbcDgNEr/ay5yU3TgN6BDcgKTYKDqH+psdTaTWqdyIiLi4E/lFPLEone/3nQLgrl4tmXJrN3xt+hUv9ZN+8kVEXNj6PTk8sTidnHPF+Hh58Mpt3bk9qqXZsURMpXIjIuKCyhxO5qTsIfHrvRgGdAn1JzE2ig7BDcyOJmI6lRsREReTlVvEmEVpbDxwGoARfcKYPKQb3l4eJicTqRtUbkREXMi6XSdIWLKZ0wUl+Nk8mHZ7D26NaGF2LJE6ReVGRMQFlDqczPpiN2+t2wfAFc0CSLonirZBfiYnE6l7VG5EROq4Y2fPM3phGpsOnQFg5FWtef6mrhpDiVyEyo2ISB2WsjObJ5du5mxhKf52T/52Z08G92hmdiyROk3lRkSkDiopc/LqmgzeWX8AgJ4tA0kcEUWrJr4mJxOp+1RuRETqmMzThcQvTGNz5lkA/np1W569sTN2T42hRCpD5UZEpA5Zsy2LZ5ZtJq+ojABvT2beFc713ULNjiXiUqxmB0hKSqJNmzZ4e3sTHR3Nxo0bf3f/s2fPEhcXR7NmzbDb7XTq1InVq1fXUloRkZpRXObgxZXbefR/N5FXVEZkq4asHttfxUbkEph65mbx4sUkJCQwf/58oqOjmT17NoMGDWLXrl0EBwf/Zv+SkhL+8pe/EBwczLJly2jRogWHDh2iYcOGtR9eRKSaHDpVQHxyGluP5gLw8J/a8fSgznh5mP7vTxGXZDEMwzDrzqOjo7nyyitJTEwEwOl0EhYWxujRoxk/fvxv9p8/fz6vvfYaGRkZeHl5Veo+iouLKS4uLv86Ly+PsLAwcnNzCQgIqJ4HIiJyiVZtOc74D7eQX1xGI18vXr87nGu7hJgdS6TOycvLIzAwsFLP36b9s6CkpIRNmzYRExPz3zBWKzExMWzYsOGCx6xcuZK+ffsSFxdHSEgI3bt3Z9q0aTgcjovez/Tp0wkMDCy/hYWFVftjERGpqqJSBxM/2kpccir5xWX0bt2I1WP7q9iIVAPTyk1OTg4Oh4OQkIp/kUNCQsjKyrrgMfv372fZsmU4HA5Wr17NCy+8wOuvv87LL7980fuZMGECubm55bfMzMxqfRwiIlW1/+Q5bnvze/73h8MAPP7n9ix6+CqaBfqYnEzEPbjUq6WcTifBwcH84x//wMPDg169enH06FFee+01Jk+efMFj7HY7dru9lpOKiFzYx+lHeW75VgpKHDTxszFrWAQDOjU1O5aIWzGt3AQFBeHh4UF2dnaF7dnZ2YSGXvjVAc2aNcPLywsPj/++10PXrl3JysqipKQEm81Wo5lFRC7V+RIHUz7ZzqKf/nP2+Kp2jZkzPJKQAG+Tk4m4H9PGUjabjV69epGSklK+zel0kpKSQt++fS94zNVXX83evXtxOp3l23bv3k2zZs1UbESkztp7Ip+hSd+x6KdMLBYYc11HFjx4lYqNSA0x9XWGCQkJvP3223zwwQfs3LmTxx57jIKCAu6//34A7r33XiZMmFC+/2OPPcbp06cZO3Ysu3fvZtWqVUybNo24uDizHoKIyO9atukIQ+Z9x67sfIIa2FnwQDQJf+mEh9VidjQRt2XqNTfDhg3j5MmTTJo0iaysLCIiIlizZk35RcaHDx/Gav1v/woLC2Pt2rWMGzeOnj170qJFC8aOHcuzzz5r1kMQEbmgwpIyJn60jeWpRwG4pkMQbwyLoKm/rgEUqWmmvs+NGaryOnkRkUuRkZVH3IJU9p0swGqBcTGdeHxgB52tEbkMVXn+dqlXS4mI1GWGYbD4p0wmr9xOcZmTkAA7c4ZHclW7JmZHE6lXVG5ERKrBueIynl+xlY/TjwEwoFNTZt0dTpMGGkOJ1DaVGxGRy7T9WC7xyWkcyCnAw2rhqes788if2mHVGErEFCo3IiKXyDAM/vfHw0z9dAclZU6aBXozb0Qkvds0NjuaSL2mciMicgnyikqZ8OFWVm09DsB1XYKZeVc4jfz0nlsiZlO5ERGpoi1HzhKfnMbh04V4Wi2Mv7ELD1zTFotFYyiRukDlRkSkkgzD4P3vDzJt9U5KHQYtGvqQGBtJZKtGZkcTkf9D5UZEpBJyC0t55sPNrN3+n8/DG9QthFfvCCfQ18vkZCLyayo3IiJ/IO3wGeKT0zh69jw2DyvPDe7CqH5tNIYSqaNUbkRELsIwDN759gB/W5NBmdOgVWNfkmKj6NEy0OxoIvI7VG5ERC7gTEEJTy3dTErGCQBu6tmM6bf3IMBbYyiRuk7lRkTkV34+eJrRC9M4nluEzdPKpJuv4J7oVhpDibgIlRsRkf/H6TSY/80+Xv98Nw6nQdsgPxJjI+nWXGMoEVeiciMiApw6V0zCks38e/dJAG6NaM4rt/WggV2/JkVcjf7Wiki998P+U4xdlEZ2XjHeXlam3NKNu3uHaQwl4qKs1fUHLV++nJ49e1bXHyciUuMcToO5KXuIffsHsvOK6RDcgI/jrmHYlbq+RsSVVanc/P3vf+fOO+8kNjaWH3/8EYCvvvqKyMhIRo4cydVXX10jIUVEqtuJ/CLufe9HZn2xG6cBd/Zqycr4q+kc6m92NBG5TJUeS82YMYNJkybRs2dPMjIy+Pjjj3n++eeZN28eY8eO5ZFHHqFRI70FuYjUfd/tzWHsonRyzhXj4+XBy0O7c0evlmbHEpFqUuly889//pO3336bUaNG8e233zJgwAC+//579u7di5+fX01mFBGpFg6nwZyUPcz7ag+GAZ1D/Em6J5IOwTpbI+JOKl1uDh8+zLXXXgtA//798fLyYsqUKSo2IuISsvOKGLMwjR8PnAZgRJ8wJg/phreXh8nJRKS6VbrcFBcX4+3tXf61zWajcePGNRJKRKQ6/Xv3ScYtTud0QQl+Ng+m3d6DWyNamB1LRGpIlV4K/sILL+Dr6wtASUkJL7/8MoGBFd/catasWdWXTkTkMpQ5nLz+xW7eWrcPgK7NAkiKjaRd0wYmJxORmlTpcvOnP/2JXbt2lX/dr18/9u/fX2EfvXRSROqKY2fPM2ZhGj8fOgPAyKta8/xNXTWGEqkHKl1u1q1bV4MxRESqz1cZ2SQs2czZwlL87Z7MuKMnN/VsZnYsEaklVRpL5eXl8eOPP1JSUkKfPn1o2rRpTeUSEamyUoeTV9dk8Pa3BwDo0SKQxNhIWjfRCx9E6pNKl5v09HQGDx5MVlYWAP7+/ixZsoRBgwbVWDgRkcrKPF3I6IVppGeeBeD+q9sw/sYu2D01hhKpbyr9DsXPPvssbdu25bvvvmPTpk1cd911xMfH12Q2EZFKWbs9i5vmfkt65lkCvD35+8heTB7STcVGpJ6q9JmbTZs28fnnnxMVFQXAe++9R+PGjcnLyyMgIKDGAoqIXExxmYMZn2Xwz+8OAhAR1pB5IyIJa+xrbjARMVWly83p06dp2fK/b0/esGFD/Pz8OHXqlMqNiNS6w6cKiUtOZevRXAAe6t+Wpwd1weZZbZ8HLCIuqkoXFO/YsaP8mhsAwzDYuXMn+fn55dv0yeAiUtNWbz3Os8u2kF9cRkNfL16/K5zruoaYHUtE6giLYRhGZXa0Wq1YLBYutPsv2y0WCw6Ho9pDVqe8vDwCAwPJzc3VGScRF1NU6uDlVTv43x8OA9C7dSPmjoikeUMfk5OJSE2ryvN3pc/cHDhw4LKDiYhcqgM5BcQtSGXH8TwAHv9ze8b9pRNeHhpDiUhFlS43H3zwAU899VT5xy+IiNSWj9OP8tzyrRSUOGjiZ2PWsAgGdNL7bInIhVV6LOXh4cHx48cJDg6u6Uw1SmMpEddRVOrgxZXbWfRTJgDRbRszd0QkIQHef3CkiLibGhlLVbIDiYhUi70n8olbkMau7HwsFhh9bUfGXNsBT42hROQPVOnVUvpgTBGpDR9uOsLEj7ZxvtRBUAM7c4ZHcHWHILNjiYiLqFK56dSp0x8WnNOnT19WIBGpvwpLypj08XaWbToCwNUdmvDGsAiC/TWGEpHKq1K5mTJlCoGBgTWVRUTqsV1Z+cQlp7L3xDmsFngiphNxAzvgYdUZYxGpmiqVm+HDh7v8BcUiUrcYhsGSnzOZvHI7RaVOQgLszBkeyVXtmpgdTURcVKXLja63EZHqdq64jIkrtvJR+jEA/tSpKW/cHU6TBnaTk4mIK9OrpUTEFDuO5RGfnMr+nAI8rBaevL4Tj/6pPVaNoUTkMlW63DidzprMISL1hGEYLPjxMC99uoOSMifNAr2ZNyKS3m0amx1NRNxEla65ERG5HHlFpUxYvpVVW44DcF2XYGbeFU4jP5vJyUTEnajciEit2Hokl/iFqRw6VYin1cL4G7vwwDVtdT2fiFQ7lRsRqVGGYfDB9weZtjqDEoeTFg19SIyNJLJVI7OjiYibUrkRkRqTW1jKMx9uZu32bACuvyKE1+4MJ9DXy+RkIuLOVG5EpEakZ54lPjmVI2fO4+Vh4bnBXbmvXxuNoUSkxqnciEi1MgyDd9cfYMZnGZQ5DVo19iUxNpKeLRuaHU1E6gmVGxGpNmcLS3hq6Wa+3HkCgJt6NGP6HT0I8NYYSkRqj8qNiFSLTYdOMzo5jWO5Rdg8rbxw8xX8T3QrjaFEpNap3IjIZXE6Df7+zX5mfr4Lh9OgbZAfibGRdGuuD9kVEXOo3IjIJTt1rpiEJZv59+6TANwa0ZxXbutBA7t+tYiIefQbSEQuyY/7TzFmURrZecXYPa28dGs37u4dpjGUiJhO5UZEqsThNHjz67288eVunAa0b+rHm/f0onOov9nRREQAlRsRqYKT+cWMW5zO+r05ANwR1ZKpQ7vha9OvEhGpO/QbSUQq5fu9OYxZlE7OuWJ8vDyYOrQ7d/ZqaXYsEZHfsJodACApKYk2bdrg7e1NdHQ0GzdurNRxixYtwmKxMHTo0JoNKFKPOZwGs77YzT3v/kjOuWI6h/izMv5qFRsRqbNMLzeLFy8mISGByZMnk5qaSnh4OIMGDeLEiRO/e9zBgwd56qmn6N+/fy0lFal/svOKuOedH5ibsgfDgOFXhvFR3NV0DNH1NSJSd5lebmbNmsVDDz3E/fffzxVXXMH8+fPx9fXlvffeu+gxDoeDe+65hylTptCuXbtaTCtSf3yz+ySD53zLD/tP42fzYM7wCGbc0RMfm4fZ0UREfpep5aakpIRNmzYRExNTvs1qtRITE8OGDRsuetxLL71EcHAwDzzwwB/eR3FxMXl5eRVuInJxZQ4nr67J4N73NnKqoISuzQL4ZPQ13BrRwuxoIiKVYuoFxTk5OTgcDkJCQipsDwkJISMj44LHrF+/nnfffZf09PRK3cf06dOZMmXK5UYVqReO555nzMI0fjp4BoD/uaoVE2+6Am8vna0REddh+liqKvLz8xk5ciRvv/02QUFBlTpmwoQJ5Obmlt8yMzNrOKWIa/oqI5vBc77lp4Nn8Ld7khgbyctDe6jYiIjLMfXMTVBQEB4eHmRnZ1fYnp2dTWho6G/237dvHwcPHmTIkCHl25xOJwCenp7s2rWL9u3bVzjGbrdjt9trIL2Ieyh1OHlt7S7+8c1+AHq0CCQxNpLWTfxMTiYicmlMLTc2m41evXqRkpJS/nJup9NJSkoK8fHxv9m/S5cubN26tcK2iRMnkp+fz5w5cwgLC6uN2CJu48iZQkYvTCPt8FkA7uvXhgmDu2D31NkaEXFdpr+JX0JCAqNGjaJ379706dOH2bNnU1BQwP333w/AvffeS4sWLZg+fTre3t507969wvENGzYE+M12Efl9n2/P4qmlm8krKiPA25NX7wznhu6/PWMqIuJqTC83w4YN4+TJk0yaNImsrCwiIiJYs2ZN+UXGhw8fxmp1qUuDROq0kjIn0z/byT+/OwhAeFhDEkdEEtbY19xgIiLVxGIYhmF2iNqUl5dHYGAgubm5BAQEmB1HpFYdPlVI/MJUthzJBeCh/m15elAXbJ76B4SI1G1Vef42/cyNiNSO1VuP8+yyLeQXl9HQ14uZd4YTc0XIHx8oIuJiVG5E3FxRqYNXVu3k//vhEAC9Wjdi3ohImjf0MTmZiEjNULkRcWMHcgqIT05l+7H/vDP3Y39uT8JfOuHloTGUiLgvlRsRN7Vy8zEmfLiFghIHjf1szLo7nD93DjY7lohIjVO5EXEzRaUOpnyyg4UbDwPQp21j5g6PJDTQ2+RkIiK1Q+VGxI3sPXGO+ORUMrLysVhg9MAOjLmuI54aQ4lIPaJyI+ImPtx0hIkfbeN8qYOgBnZmD4vgmo6V+ww2ERF3onIj4uIKS8qY9PF2lm06AkC/9k2YPTyCYH+NoUSkflK5EXFhu7PziVuQyp4T57Ba4ImYTsQN7ICH1WJ2NBER06jciLggwzBY+vMRJq3cRlGpk2B/O3OGR9K3fROzo4mImE7lRsTFFBSX8fyKrXyUfgyA/h2DeGNYBEEN7CYnExGpG1RuRFzIjmN5xCensj+nAA+rhSev78Sjf2qPVWMoEZFyKjciLsAwDJI3HmbKJzsoKXPSLNCbuSMiubJNY7OjiYjUOSo3InVcflEpE5Zv5dMtxwG4tkswr98VTiM/m8nJRETqJpUbkTps29Fc4pJTOXSqEE+rhWdv6MID17TVGEpE5Heo3IjUQYZh8K8Nh3hl1U5KHE5aNPRhXmwkUa0amR1NRKTOU7kRqWNyz5fy7LItrNmeBcD1V4Tw2p3hBPp6mZxMRMQ1qNyI1CHpmWeJT07lyJnzeHlYeG5wV+7r1waLRWMoEZHKUrkRqQMMw+Dd9Qf425oMSh0GrRr7khgbSc+WDc2OJiLiclRuREx2trCEp5Zu5sudJwAY3COUGXf0JMBbYygRkUuhciNiok2HTjM6OY1juUXYPK28cPMV/E90K42hREQug8qNiAmcToN/fLuf19buwuE0aBvkR2JsJN2aB5odTUTE5anciNSyU+eKeXLpZtbtOgnALeHNmXZ7DxrY9ddRRKQ66LepSC3aeOA0oxemkp1XjN3TypRbujHsyjCNoUREqpHKjUgtcDoN3ly3l1lf7MZpQPumfiTdE0WX0ACzo4mIuB2VG5EadjK/mIQl6Xy7JweA26NaMPXW7vhpDCUiUiP021WkBn2/N4exi9M5mV+Mj5cHL93ajbt6h5kdS0TEranciNQAh9Ngbsoe5n61B8OATiENSIqNomOIv9nRRETcnsqNSDU7kVfEmEVp/LD/NADDeofx4i3d8LF5mJxMRKR+ULkRqUbf7D7JuMXpnCoowdfmwbTbejA0soXZsURE6hWVG5FqUOZw8saXu3lz3T4MA7o2CyApNpJ2TRuYHU1EpN5RuRG5TMdzzzN2YTobD/5nDHVPdCteuPkKvL00hhIRMYPKjchl+DrjBAlL0jlTWEoDuycz7ujBzT2bmx1LRKReU7kRuQSlDicz1+7i79/sB6B7iwCSYqNo3cTP5GQiIqJyI1JFR8+eZ3RyKqmHzwJwX782TBjcBbunxlAiInWByo1IFXyxI5unlm4m93wp/t6evHZnT27o3szsWCIi8n+o3IhUQkmZkxmfZfDedwcACA9rSOKISMIa+5qcTEREfk3lRuQPZJ4uJD45lc1HcgF48Jq2PHNDF2yeVpOTiYjIhajciPyOz7Ye55kPt5BfVEagjxev3xVOzBUhZscSEZHfoXIjcgFFpQ6mrd7JvzYcAqBX60bMHRFJi4Y+JicTEZE/onIj8isHcwqIS05l+7E8AB4d0J4nr++El4fGUCIirkDlRuT/WLn5GM8t38q54jIa+9mYdXc4f+4cbHYsERGpApUbEf4zhpryyQ4WbjwMQJ+2jZk7PJLQQG+Tk4mISFWp3Ei9t+/kOeIWpJKRlY/FAvEDOzD2uo54agwlIuKSVG6kXluRdoTnV2yjsMRBUAMbs4dFck3HILNjiYjIZVC5kXrpfImDSR9vY+mmIwD0a9+E2cMiCA7QGEpExNWp3Ei9szs7n7gFqew5cQ6rBcZe14n4azvgYbWYHU1ERKqByo3UG4ZhsHTTESZ9vI2iUifB/nbmDI+kb/smZkcTEZFqpHIj9UJBcRkTP9rGirSjAPTvGMQbwyIIamA3OZmIiFQ3lRtxezuP5xGXnMr+kwV4WC0k/KUTjw1oj1VjKBERt6RyI27LMAwWbszkxU+2U1LmJDTAm3mxkVzZprHZ0UREpAap3Ihbyi8q5bkV2/hk8zEAru0SzMy7wmnsZzM5mYiI1DSVG3E7247mEp+cysFThXhaLTxzQ2cevKadxlAiIvWEyo24DcMw+P9+OMTLn+6kxOGkRUMf5sVGEtWqkdnRRESkFqnciFvIPV/K+A+38Nm2LAD+ckUIr93Zk4a+GkOJiNQ3Kjfi8jZnniV+YSqZp8/j5WFhwo1duf/qNlgsGkOJiNRHdeKTAZOSkmjTpg3e3t5ER0ezcePGi+779ttv079/fxo1akSjRo2IiYn53f3FfRmGwbvrD3Dn/O/JPH2esMY+LHu0H3+9pq2KjYhIPWZ6uVm8eDEJCQlMnjyZ1NRUwsPDGTRoECdOnLjg/uvWrWPEiBF8/fXXbNiwgbCwMK6//nqOHj1ay8nFTGcLS3joX5uY+ukOSh0Gg3uEsmpMf8LDGpodTURETGYxDMMwM0B0dDRXXnkliYmJADidTsLCwhg9ejTjx4//w+MdDgeNGjUiMTGRe++99w/3z8vLIzAwkNzcXAICAi47v9S+TYfOMGZhGkfPnsfmYeWFm7vyP1e11tkaERE3VpXnb1OvuSkpKWHTpk1MmDChfJvVaiUmJoYNGzZU6s8oLCyktLSUxo0v/MZsxcXFFBcXl3+dl5d3eaHFNE6nwdvf7ue1tbsocxq0aeJLYmwU3VsEmh1NRETqEFPHUjk5OTgcDkJCQipsDwkJISsrq1J/xrPPPkvz5s2JiYm54PenT59OYGBg+S0sLOyyc0vtO11QwgMf/MT0zzIocxrcEt6cT8f0V7EREZHfMP2am8sxY8YMFi1axIoVK/D29r7gPhMmTCA3N7f8lpmZWcsp5XJtPHCawXO+5etdJ7F7Wpl+ew/mDI+ggV0v9hMRkd8y9dkhKCgIDw8PsrOzK2zPzs4mNDT0d4+dOXMmM2bM4Msvv6Rnz54X3c9ut2O365OfXZHTafDWv/cx64vdOJwG7Zr6kRQbRddmulZKREQuztQzNzabjV69epGSklK+zel0kpKSQt++fS963KuvvsrUqVNZs2YNvXv3ro2oUstyzhUz6p8beW3tLhxOg9sjW/BJ/DUqNiIi8odMP6+fkJDAqFGj6N27N3369GH27NkUFBRw//33A3DvvffSokULpk+fDsDf/vY3Jk2aRHJyMm3atCm/NqdBgwY0aNDAtMch1ef7fTmMXZTOyfxivL2sTL21O3f11rVSIiJSOaaXm2HDhnHy5EkmTZpEVlYWERERrFmzpvwi48OHD2O1/vcE01tvvUVJSQl33nlnhT9n8uTJvPjii7UZXaqZw2kw76s9zE3Zg9OATiENSIqNomOIv9nRRETEhZj+Pje1Te9zUzedyCviicXpfL/vFADDeofx4i3d8LF5mJxMRETqApd5nxsRgG/3nGTc4nRyzpXga/Ng2m09GBrZwuxYIiLiolRuxDRlDiezv9xD0rq9GAZ0CfUn6Z4o2jfVtVMiInLpVG7EFMdzzzN2YTobD54G4J7oVrxw8xV4e2kMJSIil0flRmrd17tOkLA4nTOFpTSwezL99h4MCW9udiwREXETKjdSa0odTmZ+vou//3s/AN1bBJA4Ioo2QX4mJxMREXeiciO14ujZ84xOTiX18FkA7uvXhgmDu2D31BhKRESql8qN1LgvdmTz1NLN5J4vxd/bk9fu7MkN3ZuZHUtERNyUyo3UmJIyJ39bk8G76w8AEN4ykMTYKMIa+5qcTERE3JnKjdSIzNOFxC9MY3PmWQAevKYtz9zQBZunS38QvYiIuACVG6l2a7Yd5+llW8gvKiPQx4vX7won5ooQs2OJiEg9oXIj1aa4zMG0VTv5YMMhAKJaNWRebBQtGvqYnExEROoTlRupFgdzCohfmMq2o3kAPDKgHU9d3xkvD42hRESkdqncyGX7ZPMxJizfyrniMhr72Xj97nAGdg42O5aIiNRTKjdyyYpKHbz06Q6SfzwMQJ82jZk7IpLQQG+Tk4mISH2mciOXZN/Jc8QtSCUjKx+LBeIHdmDsdR3x1BhKRERMpnIjVbYi7QjPr9hGYYmDoAY23hgWQf+OTc2OJSIiAqjcSBWcL3EweeU2lvx8BIC+7ZowZ3gEwQEaQ4mISN2hciOVsic7n7jkVHZnn8NigbHXdWT0tR3xsFrMjiYiIlKByo38oaU/Z/LCx9soKnXS1N/OnOER9GsfZHYsERGRC1K5kYsqKC7jhY+3sTz1KAD9OwbxxrAIghrYTU4mIiJycSo3ckEZWXnELUhl38kCrBZ48vrOPDagPVaNoUREpI5TuZEKDMNg0U+ZvLhyO8VlTkIDvJk7IpI+bRubHU1ERKRSVG6kXH5RKc+t2MYnm48BMLBzU16/O4LGfjaTk4mIiFSeyo0AsO1oLvHJqRw8VYin1cLTgzrzUP92GkOJiIjLUbmp5wzD4H9/OMTUT3dS4nDSoqEPc0dE0qt1I7OjiYiIXBKVm3osr6iU8R9uYfXWLABiuoYw866eNPTVGEpERFyXyk09tTnzLPELU8k8fR4vDwvjb+zKX69ug8WiMZSIiLg2lZt6xjAM/vndQaZ/tpNSh0FYYx8SR0QRHtbQ7GgiIiLVQuWmHjlbWMLTy7bwxY5sAG7sHsqMO3oS6ONlcjIREZHqo3JTT6QePsPo5DSOnj2PzcPKxJu7MvKq1hpDiYiI21G5cXNOp8E76/fz6ppdlDkN2jTxJTE2iu4tAs2OJiIiUiNUbtzY6YISnlq6ma8yTgAwJLw5027rjr+3xlAiIuK+VG7c1E8HTzNmYRrHc4uwe1qZPKQbI/qEaQwlIiJuT+XGzTidBm/9ex+zvtiNw2nQrqkfSbFRdG0WYHY0ERGRWqFy40ZyzhUzbnE63+7JAeD2yBZMHdodP7v+N4uISP2hZz03sWHfKcYuSuNEfjHeXlZeurU7d/VqqTGUiIjUOyo3Ls7hNEj8ai9zUnbjNKBjcAOS7omiU4i/2dFERERMoXLjwk7kF/HEonS+33cKgLt7t2TKLd3xsXmYnExERMQ8Kjcuav2eHJ5YnEbOuRJ8bR68clt3botsaXYsERER06ncuJgyh5M5KXtI/HovhgFdQv1JjI2iQ3ADs6OJiIjUCSo3LiQrt4gxi9LYeOA0ALHRrZh08xV4e2kMJSIi8guVGxexbtcJEpZs5nRBCQ3snky7vQe3hDc3O5aIiEido3JTx5U6nLz++W7m/3sfAN2aB5AUG0WbID+Tk4mIiNRNKjd12NGz5xmzMI1Nh84AMKpvayYM7qoxlIiIyO9QuamjvtyRzVPLNnO2sBR/b09evaMnN/ZoZnYsERGROk/lpo4pKXPy6poM3ll/AIDwloHMGxFFqya+JicTERFxDSo3dUjm6ULiF6axOfMsAA9c05Znb+iCzdNqbjAREREXonJTR6zZlsXTyzaTX1RGoI8XM+8K5y9XhJgdS0RExOWo3JisuMzB9NUZvP/9QQCiWjVk7ohIWjbSGEpERORSqNyY6NCpAuKT09h6NBeARwa046nrO+PloTGUiIjIpVK5McmnW44x/sOtnCsuo5GvF7PujmBgl2CzY4mIiLg8lZtaVlTqYOqnO1jw42EArmzTiLkjImkW6GNyMhEREfegclOL9p88R1xyGjuP52GxQNyfO/BETEc8NYYSERGpNio3teSjtKM8t2IrhSUOmvjZmD08gv4dm5odS0RExO2o3NSw8yUOXly5ncU/ZwLQt10T5gyPIDjA2+RkIiIi7knlpgbtyc4nLjmV3dnnsFhg7HUdGX1tRzysFrOjiYiIuK06cbFHUlISbdq0wdvbm+joaDZu3Pi7+y9dupQuXbrg7e1Njx49WL16dS0lrbylP2dyS+J37M4+R1N/OwsejOaJmE4qNiIiIjXM9HKzePFiEhISmDx5MqmpqYSHhzNo0CBOnDhxwf2///57RowYwQMPPEBaWhpDhw5l6NChbNu2rZaTX1hBcRkJS9J5etkWzpc66N8xiNVj+tOvfZDZ0UREROoFi2EYhpkBoqOjufLKK0lMTATA6XQSFhbG6NGjGT9+/G/2HzZsGAUFBXz66afl26666ioiIiKYP3/+H95fXl4egYGB5ObmEhAQUH0PBMjIyiNuQSr7ThZgtcCT13fmsQHtsepsjYiIyGWpyvO3qWduSkpK2LRpEzExMeXbrFYrMTExbNiw4YLHbNiwocL+AIMGDbro/sXFxeTl5VW41YQvdmRza+J37DtZQGiAN4se7kvcwA4qNiIiIrXM1HKTk5ODw+EgJKTiB0SGhISQlZV1wWOysrKqtP/06dMJDAwsv4WFhVVP+F/p2swfby8P/ty5KavH9qdP28Y1cj8iIiLy+0y/5qamTZgwgdzc3PJbZmZmjdxPy0a+rHi8H++NupLGfrYauQ8RERH5Y6a+FDwoKAgPDw+ys7MrbM/OziY0NPSCx4SGhlZpf7vdjt1ur57Af6Bd0wa1cj8iIiJycaaeubHZbPTq1YuUlJTybU6nk5SUFPr27XvBY/r27Vthf4AvvvjiovuLiIhI/WL6m/glJCQwatQoevfuTZ8+fZg9ezYFBQXcf//9ANx77720aNGC6dOnAzB27FgGDBjA66+/zk033cSiRYv4+eef+cc//mHmwxAREZE6wvRyM2zYME6ePMmkSZPIysoiIiKCNWvWlF80fPjwYazW/55g6tevH8nJyUycOJHnnnuOjh078tFHH9G9e3ezHoKIiIjUIaa/z01tq8n3uREREZGa4TLvcyMiIiJS3VRuRERExK2o3IiIiIhbUbkRERERt6JyIyIiIm5F5UZERETcisqNiIiIuBWVGxEREXErKjciIiLiVkz/+IXa9ssbMufl5ZmcRERERCrrl+ftynywQr0rN/n5+QCEhYWZnERERESqKj8/n8DAwN/dp959tpTT6eTYsWP4+/tjsViq9c/Oy8sjLCyMzMxMfW5VDdI61w6tc+3QOtcerXXtqKl1NgyD/Px8mjdvXuEDtS+k3p25sVqttGzZskbvIyAgQH9xaoHWuXZonWuH1rn2aK1rR02s8x+dsfmFLigWERERt6JyIyIiIm5F5aYa2e12Jk+ejN1uNzuKW9M61w6tc+3QOtcerXXtqAvrXO8uKBYRERH3pjM3IiIi4lZUbkRERMStqNyIiIiIW1G5EREREbeiclNFSUlJtGnTBm9vb6Kjo9m4cePv7r906VK6dOmCt7c3PXr0YPXq1bWU1LVVZZ3ffvtt+vfvT6NGjWjUqBExMTF/+P9F/qOqP8+/WLRoERaLhaFDh9ZsQDdR1XU+e/YscXFxNGvWDLvdTqdOnfS7oxKqus6zZ8+mc+fO+Pj4EBYWxrhx4ygqKqqltK7pm2++YciQITRv3hyLxcJHH330h8esW7eOqKgo7HY7HTp04P3336/xnBhSaYsWLTJsNpvx3nvvGdu3bzceeugho2HDhkZ2dvYF9//uu+8MDw8P49VXXzV27NhhTJw40fDy8jK2bt1ay8ldS1XXOTY21khKSjLS0tKMnTt3Gvfdd58RGBhoHDlypJaTu5aqrvMvDhw4YLRo0cLo37+/ceutt9ZOWBdW1XUuLi42evfubQwePNhYv369ceDAAWPdunVGenp6LSd3LVVd5wULFhh2u91YsGCBceDAAWPt2rVGs2bNjHHjxtVycteyevVq4/nnnzeWL19uAMaKFSt+d//9+/cbvr6+RkJCgrFjxw5j3rx5hoeHh7FmzZoazalyUwV9+vQx4uLiyr92OBxG8+bNjenTp19w/7vvvtu46aabKmyLjo42HnnkkRrN6eqqus6/VlZWZvj7+xsffPBBTUV0C5eyzmVlZUa/fv2Md955xxg1apTKTSVUdZ3feusto127dkZJSUltRXQLVV3nuLg449prr62wLSEhwbj66qtrNKc7qUy5eeaZZ4xu3bpV2DZs2DBj0KBBNZjMMDSWqqSSkhI2bdpETExM+Tar1UpMTAwbNmy44DEbNmyosD/AoEGDLrq/XNo6/1phYSGlpaU0bty4pmK6vEtd55deeong4GAeeOCB2ojp8i5lnVeuXEnfvn2Ji4sjJCSE7t27M23aNBwOR23FdjmXss79+vVj06ZN5aOr/fv3s3r1agYPHlwrmesLs54H690HZ16qnJwcHA4HISEhFbaHhISQkZFxwWOysrIuuH9WVlaN5XR1l7LOv/bss8/SvHnz3/yFkv+6lHVev3497777Lunp6bWQ0D1cyjrv37+fr776invuuYfVq1ezd+9eHn/8cUpLS5k8eXJtxHY5l7LOsbGx5OTkcM0112AYBmVlZTz66KM899xztRG53rjY82BeXh7nz5/Hx8enRu5XZ27ErcyYMYNFixaxYsUKvL29zY7jNvLz8xk5ciRvv/02QUFBZsdxa06nk+DgYP7xj3/Qq1cvhg0bxvPPP8/8+fPNjuZW1q1bx7Rp03jzzTdJTU1l+fLlrFq1iqlTp5odTaqBztxUUlBQEB4eHmRnZ1fYnp2dTWho6AWPCQ0NrdL+cmnr/IuZM2cyY8YMvvzyS3r27FmTMV1eVdd53759HDx4kCFDhpRvczqdAHh6erJr1y7at29fs6Fd0KX8PDdr1gwvLy88PDzKt3Xt2pWsrCxKSkqw2Ww1mtkVXco6v/DCC4wcOZIHH3wQgB49elBQUMDDDz/M888/j9Wqf/tXh4s9DwYEBNTYWRvQmZtKs9ls9OrVi5SUlPJtTqeTlJQU+vbte8Fj+vbtW2F/gC+++OKi+8ulrTPAq6++ytSpU1mzZg29e/eujagurarr3KVLF7Zu3Up6enr57ZZbbmHgwIGkp6cTFhZWm/FdxqX8PF999dXs3bu3vDwC7N69m2bNmqnYXMSlrHNhYeFvCswvhdLQRy5WG9OeB2v0cmU3s2jRIsNutxvvv/++sWPHDuPhhx82GjZsaGRlZRmGYRgjR440xo8fX77/d999Z3h6ehozZ840du7caUyePFkvBa+Eqq7zjBkzDJvNZixbtsw4fvx4+S0/P9+sh+ASqrrOv6ZXS1VOVdf58OHDhr+/vxEfH2/s2rXL+PTTT43g4GDj5ZdfNushuISqrvPkyZMNf39/Y+HChcb+/fuNzz//3Gjfvr1x9913m/UQXEJ+fr6RlpZmpKWlGYAxa9YsIy0tzTh06JBhGIYxfvx4Y+TIkeX7//JS8KefftrYuXOnkZSUpJeC10Xz5s0zWrVqZdhsNqNPnz7GDz/8UP69AQMGGKNGjaqw/5IlS4xOnToZNpvN6Natm7Fq1apaTuyaqrLOrVu3NoDf3CZPnlz7wV1MVX+e/y+Vm8qr6jp///33RnR0tGG324127doZr7zyilFWVlbLqV1PVda5tLTUePHFF4327dsb3t7eRlhYmPH4448bZ86cqf3gLuTrr7++4O/bX9Z21KhRxoABA35zTEREhGGz2Yx27doZ//znP2s8p8UwdP5NRERE3IeuuRERERG3onIjIiIibkXlRkRERNyKyo2IiIi4FZUbERERcSsqNyIiIuJWVG5ERETErajciIiIiFtRuRERERG3onIjInXefffdh8Vi+c1t7969Fb5ns9no0KEDL730EmVlZQCsW7euwjFNmzZl8ODBbN261eRHJSI1ReVGRFzCDTfcwPHjxyvc2rZtW+F7e/bs4cknn+TFF1/ktddeq3D8rl27OH78OGvXrqW4uJibbrqJkpISMx6KiNQwlRsRcQl2u53Q0NAKNw8Pjwrfa926NY899hgxMTGsXLmywvHBwcGEhoYSFRXFE088QWZmJhkZGWY8FBGpYSo3IuJ2fHx8LnpWJjc3l0WLFgFgs9lqM5aI1BJPswOIiFTGp59+SoMGDcq/vvHGG1m6dGmFfQzDICUlhbVr1zJ69OgK32vZsiUABQUFANxyyy106dKlhlOLiBlUbkTEJQwcOJC33nqr/Gs/P7/y//6l+JSWluJ0OomNjeXFF1+scPy3336Lr68vP/zwA9OmTWP+/Pm1FV1EapnKjYi4BD8/Pzp06HDB7/1SfGw2G82bN8fT87e/2tq2bUvDhg3p3LkzJ06cYNiwYXzzzTc1HVtETKBrbkTE5f1SfFq1anXBYvNrcXFxbNu2jRUrVtRCOhGpbSo3IlLv+Pr68tBDDzF58mQMwzA7johUM5UbEamX4uPj2blz528uShYR12cx9M8WERERcSM6cyMiIiJuReVGRERE3IrKjYiIiLgVlRsRERFxKyo3IiIi4lZUbkRERMStqNyIiIiIW1G5EREREbeiciMiIiJuReVGRERE3IrKjYiIiLiV/x/M7Xyg5sq41gAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.5"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:16.828915Z",
     "start_time": "2024-05-31T00:16:16.821268Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/salary_models/health_LogisticRegression_model.joblib')"
   ],
   "id": "8cfea4364418a43b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/health_LogisticRegression_model.joblib']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 决策树模型",
   "id": "349ff6ccf677bd10"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:44.402607Z",
     "start_time": "2024-05-31T00:16:16.829924Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 决策树模型\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "# 设置参数网格\n",
    "param_grid = {\n",
    "    'max_depth': [i for i in range(2, 10)],\n",
    "    'min_samples_split': [i for i in range(2, 10)],\n",
    "    \"criterion\": ['gini', 'entropy'],\n",
    "    'max_leaf_nodes': [i for i in range(2, 10)],  # 最大叶子节点数\n",
    "}\n",
    "\n",
    "# 创建GridSearchCV对象\n",
    "grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5, scoring='f1')\n",
    "# 拟合GridSearchCV对象\n",
    "grid_search.fit(X_train, y_train)\n",
    "# 打印最佳参数\n",
    "# print(grid_search.best_params_)"
   ],
   "id": "1ff2bbb236da3b37",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={'criterion': ['gini', 'entropy'],\n",
       "                         'max_depth': [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         'max_leaf_nodes': [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         'min_samples_split': [2, 3, 4, 5, 6, 7, 8, 9]},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;max_leaf_nodes&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;min_samples_split&#x27;: [2, 3, 4, 5, 6, 7, 8, 9]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=DecisionTreeClassifier(),\n",
       "             param_grid={&#x27;criterion&#x27;: [&#x27;gini&#x27;, &#x27;entropy&#x27;],\n",
       "                         &#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;max_leaf_nodes&#x27;: [2, 3, 4, 5, 6, 7, 8, 9],\n",
       "                         &#x27;min_samples_split&#x27;: [2, 3, 4, 5, 6, 7, 8, 9]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: DecisionTreeClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=7, max_leaf_nodes=9, min_samples_split=7)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=7, max_leaf_nodes=9, min_samples_split=7)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:44.488728Z",
     "start_time": "2024-05-31T00:16:44.406685Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn import metrics\n",
    "\n",
    "model_tree = grid_search.best_estimator_\n",
    "y_pred = model_tree.predict(X_test)\n",
    "\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "b8a9198c2cccc621",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[937   3]\n",
      " [ 41   1]]\n",
      "0.955193482688391\n",
      "0.25\n",
      "0.023809523809523808\n",
      "0.043478260869565216\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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GxEREfEoKjciIiLiUVRuRERExKOo3IiIiIhHUblpoKVLlxIbG4uvry/Jycls3779J9d/5513iI+Px9fXl549e7Ju3bpmSureGjLOr732GgMHDqRt27a0bduWlJSUc/6/yPca+v38g9TUVCwWCzfffHPTBvQQDR3nkydPMnbsWKKiovDx8aFz58763VEPDR3nhQsX0qVLF/z8/IiJieHhhx+msrKymdK6p08//ZRhw4bRrl07LBYL77///jm32bx5M71798bHx4e4uDjefPPNJs+JIfWWmppq2O1244033jD27dtn3HvvvUabNm2MwsLCM66/detWw2azGfPmzTP2799vPPnkk4a3t7exZ8+eZk7uXho6zqNHjzaWLl1qpKWlGRkZGcbdd99thISEGEeOHGnm5O6loeP8g5ycHKN9+/bGwIEDjZtuuql5wrqxho5zVVWV0bdvX+P66683tmzZYuTk5BibN2820tPTmzm5e2noOP/97383fHx8jL///e9GTk6OsWHDBiMqKsp4+OGHmzm5e1m3bp3xxBNPGKtWrTIAY/Xq1T+5/qFDhwx/f39j0qRJxv79+43FixcbNpvNWL9+fZPmVLlpgH79+hljx46t/djpdBrt2rUz5syZc8b1hw8fbgwdOrTOsuTkZOP+++9v0pzurqHj/L9qamqMoKAg46233mqqiB7hfMa5pqbGGDBggPGnP/3JGDNmjMpNPTR0nF999VWjU6dOhsPhaK6IHqGh4zx27Fjj2muvrbNs0qRJxhVXXNGkOT1JfcrNo48+anTv3r3OshEjRhiDBw9uwmSGobel6snhcLBjxw5SUlJql1mtVlJSUti2bdsZt9m2bVud9QEGDx581vXl/Mb5f1VUVFBdXU1oaGhTxXR75zvOTz/9NOHh4fz2t79tjphu73zG+YMPPqB///6MHTuWiIgIevTowezZs3E6nc0V2+2czzgPGDCAHTt21L51dejQIdatW8f111/fLJlbC7P2g63uxpnnq7i4GKfTSURERJ3lERERZGZmnnGbgoKCM65fUFDQZDnd3fmM8/967LHHaNeu3Y9+oOS/zmect2zZwuuvv056enozJPQM5zPOhw4d4uOPP+ZXv/oV69atIzs7mwcffJDq6mpmzpzZHLHdzvmM8+jRoykuLubKK6/EMAxqamp44IEHePzxx5sjcqtxtv1gaWkpp0+fxs/Pr0meV0duxKPMnTuX1NRUVq9eja+vr9lxPEZZWRl33nknr732GmFhYWbH8Wgul4vw8HD++Mc/0qdPH0aMGMETTzzBsmXLzI7mUTZv3szs2bN55ZVX2LlzJ6tWrWLt2rU888wzZkeTRqAjN/UUFhaGzWajsLCwzvLCwkIiIyPPuE1kZGSD1pfzG+cfvPDCC8ydO5d//etfJCQkNGVMt9fQcT548CCHDx9m2LBhtctcLhcAXl5eZGVlcemllzZtaDd0Pt/PUVFReHt7Y7PZapd17dqVgoICHA4Hdru9STO7o/MZ5+nTp3PnnXfyu9/9DoCePXtSXl7OfffdxxNPPIHVqr/9G8PZ9oPBwcFNdtQGdOSm3ux2O3369GHTpk21y1wuF5s2baJ///5n3KZ///511gf46KOPzrq+nN84A8ybN49nnnmG9evX07dv3+aI6tYaOs7x8fHs2bOH9PT02seNN97IoEGDSE9PJyYmpjnju43z+X6+4ooryM7Ori2PAAcOHCAqKkrF5izOZ5wrKip+VGB+KJSGbrnYaEzbDzbp6coeJjU11fDx8THefPNNY//+/cZ9991ntGnTxigoKDAMwzDuvPNOY+rUqbXrb9261fDy8jJeeOEFIyMjw5g5c6YuBa+Hho7z3LlzDbvdbrz77rtGfn5+7aOsrMysl+AWGjrO/0tXS9VPQ8c5NzfXCAoKMsaNG2dkZWUZa9asMcLDw41nn33WrJfgFho6zjNnzjSCgoKM5cuXG4cOHTI2btxoXHrppcbw4cPNegluoayszEhLSzPS0tIMwFiwYIGRlpZmfPPNN4ZhGMbUqVONO++8s3b9Hy4Ff+SRR4yMjAxj6dKluhS8JVq8eLHRoUMHw263G/369TO++OKL2s9dffXVxpgxY+qsv3LlSqNz586G3W43unfvbqxdu7aZE7unhozzJZdcYgA/esycObP5g7uZhn4//18qN/XX0HH+/PPPjeTkZMPHx8fo1KmT8dxzzxk1NTXNnNr9NGScq6urjaeeesq49NJLDV9fXyMmJsZ48MEHje+++675g7uRTz755Iy/b38Y2zFjxhhXX331j7bp1auXYbfbjU6dOhl//vOfmzynxTB0/E1EREQ8h865EREREY+iciMiIiIeReVGREREPIrKjYiIiHgUlRsRERHxKCo3IiIi4lFUbkRERMSjqNyIiIiIR1G5EREREY+iciMiLd7dd9+NxWL50SM7O7vO5+x2O3FxcTz99NPU1NQAsHnz5jrbXHzxxVx//fXs2bPH5FclIk1F5UZE3MIvf/lL8vPz6zw6duxY53Nff/01kydP5qmnnmL+/Pl1ts/KyiI/P58NGzZQVVXF0KFDcTgcZrwUEWliKjci4hZ8fHyIjIys87DZbHU+d8kll/D73/+elJQUPvjggzrbh4eHExkZSe/evZk4cSJ5eXlkZmaa8VJEpImp3IiIx/Hz8zvrUZmSkhJSU1MBsNvtzRlLRJqJl9kBRETqY82aNQQGBtZ+PGTIEN5555066xiGwaZNm9iwYQPjx4+v87no6GgAysvLAbjxxhuJj49v4tQiYgaVGxFxC4MGDeLVV1+t/TggIKD23z8Un+rqalwuF6NHj+app56qs/1nn32Gv78/X3zxBbNnz2bZsmXNFV1EmpnKjYi4hYCAAOLi4s74uR+Kj91up127dnh5/fhXW8eOHWnTpg1dunShqKiIESNG8OmnnzZ1bBExgc65ERG390Px6dChwxmLzf8aO3Yse/fuZfXq1c2QTkSam8qNiLQ6/v7+3HvvvcycORPDMMyOIyKNTOVGRFqlcePGkZGR8aOTkkXE/VkM/dkiIiIiHkRHbkRERMSjqNyIiIiIR1G5EREREY+iciMiIiIeReVGREREPIrKjYiIiHgUlRsRERHxKCo3IiIi4lFUbkRERMSjqNyIiIiIR1G5EREREY/y/wAiVGEppihwEAAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.5103090172239108"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:44.500847Z",
     "start_time": "2024-05-31T00:16:44.489739Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model_tree, './models/salary_models/health_DecisionTreeClassifier_model.joblib')"
   ],
   "id": "fb156ea350233eff",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/health_DecisionTreeClassifier_model.joblib']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# KNN算法",
   "id": "c151255688007752"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:51.045755Z",
     "start_time": "2024-05-31T00:16:44.502853Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "param_grid = {\n",
    "    'n_neighbors': [i for i in range(1, 11)],  # 可以尝试不同的K值\n",
    "    'weights': ['uniform', 'distance'],  # 可以尝试不同的权重策略\n",
    "    'metric': ['euclidean', 'manhattan'],  # 可以尝试不同的距离度量\n",
    "}\n",
    "\n",
    "# 创建GridSearchCV对象\n",
    "grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5, scoring='f1')\n",
    "# 拟合GridSearchCV对象\n",
    "grid_search.fit(X_train, y_train)\n",
    "# 打印最佳参数\n",
    "print(grid_search.best_params_)\n"
   ],
   "id": "902bc31f78f0996e",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'metric': 'manhattan', 'n_neighbors': 3, 'weights': 'distance'}\n"
     ]
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:51.200117Z",
     "start_time": "2024-05-31T00:16:51.047762Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "d445c121a2f8ba5",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[925  15]\n",
      " [ 41   1]]\n",
      "0.9429735234215886\n",
      "0.0625\n",
      "0.023809523809523808\n",
      "0.034482758620689655\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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PciXX355xufbX8Z2+PDhxhVXXPGbY2JiYgy73W60bdvW+Mc//lHrOS2GofNvIiIi4j10zY2IiIh4FZUbERER8SoqNyIiIuJVVG5ERETEq6jciIiIiFdRuRERERGvonIjIiIiXkXlRkRERLyKyo2IiIh4FZUbEanz7rvvPiwWy29uu3btqvQ9u91O+/btefHFFykvLwdg9erVlY5p0qQJAwcOZOPGjSY/KhGpLSo3IuIRrr/+eg4fPlzp1qZNm0rf27lzJ08++STPP/88r776aqXjt2/fzuHDh1m1ahUlJSUMGjSI0tJSMx6KiNQylRsR8QgOh4PIyMhKN5vNVul7rVq14rHHHiM+Pp6PP/640vHh4eFERkbSs2dPHn/8cbKysti2bZsZD0VEapnKjYh4HX9//7OelcnLy2PhwoUA2O12d8YSETfxMTuAiEhVfPLJJzRo0KDi6xtuuIElS5ZU2scwDFJSUli1ahUjR46s9L0WLVoAUFhYCMBNN91E586dazm1iJhB5UZEPMJVV13FG2+8UfF1YGBgxX//UnzKyspwuVwMGzaM559/vtLx33zzDQEBAXz//fdMmTKFefPmuSu6iLiZyo2IeITAwEDat29/xu/9UnzsdjvNmjXDx+e3T21t2rShYcOGdOrUiSNHjjB06FC+/vrr2o4tIibQNTci4vF+KT4tW7Y8Y7H5tREjRrBp0yY++OADN6QTEXdTuRGReicgIICHHnqISZMmYRiG2XFEpIap3IhIvZSYmMjWrVt/c1GyiHg+i6E/W0RERMSL6MyNiIiIeBWVGxEREfEqKjciIiLiVVRuRERExKuo3IiIiIhXUbkRERERr6JyIyIiIl5F5UZERES8isqNiIiIeBWVGxEREfEqKjciIiLiVf4/oytxGzwzhyUAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.5039260385005065"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:51.215488Z",
     "start_time": "2024-05-31T00:16:51.201128Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/salary_models/health_KNeighborsClassifier_model.joblib')"
   ],
   "id": "e10a9683f2c7a639",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/health_KNeighborsClassifier_model.joblib']"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 贝叶斯算法",
   "id": "d1c9739cc69b258e"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:51.469951Z",
     "start_time": "2024-05-31T00:16:51.217491Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.naive_bayes import GaussianNB, MultinomialNB\n",
    "\n",
    "# 设置参数网格\n",
    "param_grid = {\n",
    "    'var_smoothing': [1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1],  # 可以尝试不同的平滑参数'\n",
    "}\n",
    "\n",
    "# 创建GridSearchCV对象\n",
    "grid_search = GridSearchCV(GaussianNB(), param_grid, cv=5, scoring='f1')\n",
    "# 拟合GridSearchCV对象\n",
    "grid_search.fit(X_train, y_train)"
   ],
   "id": "46d2583a8bd10f36",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=GaussianNB(),\n",
       "             param_grid={'var_smoothing': [1e-09, 1e-08, 1e-07, 1e-06, 1e-05,\n",
       "                                           0.0001, 0.001, 0.01, 0.1]},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=GaussianNB(),\n",
       "             param_grid={&#x27;var_smoothing&#x27;: [1e-09, 1e-08, 1e-07, 1e-06, 1e-05,\n",
       "                                           0.0001, 0.001, 0.01, 0.1]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=GaussianNB(),\n",
       "             param_grid={&#x27;var_smoothing&#x27;: [1e-09, 1e-08, 1e-07, 1e-06, 1e-05,\n",
       "                                           0.0001, 0.001, 0.01, 0.1]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: GaussianNB</label><div class=\"sk-toggleable__content fitted\"><pre>GaussianNB(var_smoothing=0.1)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;GaussianNB<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.naive_bayes.GaussianNB.html\">?<span>Documentation for GaussianNB</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>GaussianNB(var_smoothing=0.1)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:51.584929Z",
     "start_time": "2024-05-31T00:16:51.470959Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "a9b4f0fd0b6b1b23",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[656 284]\n",
      " [ 12  30]]\n",
      "0.6985743380855397\n",
      "0.09554140127388536\n",
      "0.7142857142857143\n",
      "0.16853932584269662\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.7060790273556231"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:16:51.597915Z",
     "start_time": "2024-05-31T00:16:51.585939Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/salary_models/health_GaussianNB_model.joblib')"
   ],
   "id": "a4edc658701e8c02",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/health_GaussianNB_model.joblib']"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 支持向量机算法",
   "id": "229b0d87e2f58db5"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:17:03.228251Z",
     "start_time": "2024-05-31T00:16:51.599929Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.svm import SVC\n",
    "\n",
    "# 定义参数网格\n",
    "param_grid = {\n",
    "    'C': [0.1, 1, 10, 100],  # 可以尝试的C值\n",
    "    'gamma': ['scale', 'auto', 0.01, 0.1, 1],  # 可以尝试的gamma值\n",
    "    'kernel': ['rbf']  # 这里固定为RBF核\n",
    "}\n",
    "\n",
    "# 创建网格搜索对象\n",
    "grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring='f1')\n",
    "\n",
    "# 执行网格搜索\n",
    "grid_search.fit(X_train, y_train)"
   ],
   "id": "cfcf9b3ec28a51aa",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=SVC(),\n",
       "             param_grid={'C': [0.1, 1, 10, 100],\n",
       "                         'gamma': ['scale', 'auto', 0.01, 0.1, 1],\n",
       "                         'kernel': ['rbf']},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=SVC(),\n",
       "             param_grid={&#x27;C&#x27;: [0.1, 1, 10, 100],\n",
       "                         &#x27;gamma&#x27;: [&#x27;scale&#x27;, &#x27;auto&#x27;, 0.01, 0.1, 1],\n",
       "                         &#x27;kernel&#x27;: [&#x27;rbf&#x27;]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=SVC(),\n",
       "             param_grid={&#x27;C&#x27;: [0.1, 1, 10, 100],\n",
       "                         &#x27;gamma&#x27;: [&#x27;scale&#x27;, &#x27;auto&#x27;, 0.01, 0.1, 1],\n",
       "                         &#x27;kernel&#x27;: [&#x27;rbf&#x27;]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: SVC</label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=100, gamma=0.1)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=100, gamma=0.1)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:17:03.416478Z",
     "start_time": "2024-05-31T00:17:03.230361Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "37030a4e09ca3f96",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[907  33]\n",
      " [ 39   3]]\n",
      "0.9266802443991853\n",
      "0.08333333333333333\n",
      "0.07142857142857142\n",
      "0.07692307692307693\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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q5SUlACwZs2aMts0bNiQfv36sX37dpNflYhUFZUbEXELd911FydOnCjzaNmyZZnv7du3j5EjRzJx4kSmTp1aZvu0tDROnDjBN998Q1FREf3798fhcJjxUkSkiqnciIhbsNvthIeHl3l4eXmV+V7z5s35wx/+QFxcHF9++WWZ7UNDQwkPD+eGG27gueee48iRI+zZs8eMlyIiVUzlRkQ8jp+f32WPyuTk5JCcnAyAzWarzlgiUk28zQ4gIlIeS5YsoU6dOqVf33333SxYsKDMOoZhsGrVKr755hueffbZMt9r2rQpAPn5+QAMHDiQDh06VHFqETGDyo2IuIXbbruN9957r/TrgICA0v/+pfgUFxfjcrl4+OGHmThxYpntv//+e/z9/fnhhx+YNGkSc+fOra7oIlLNVG5ExC0EBATQpk2bS37vl+Jjs9lo3Lgx3t4X/2hr2bIldevWpX379pw8eZL4+HjWrl1b1bFFxASauRERt/dL8WnWrNkli81/GzZsGDt27GDx4sXVkE5EqpvKjYjUOv7+/jz55JNMmDABwzDMjiMilUzlRkRqpWeeeYbdu3dfNJQsIu7PYujXFhEREfEgOnIjIiIiHkXlRkRERDyKyo2IiIh4FJUbERER8SgqNyIiIuJRVG5ERETEo6jciIiIiEdRuRERERGPonIjIiIiHkXlRkRERDyKyo2IiIh4lP8PcVhVYt0HQzcAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.518161094224924"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:17:03.435436Z",
     "start_time": "2024-05-31T00:17:03.418493Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/salary_models/health_svm_model.joblib')"
   ],
   "id": "ac5235eeccb8331a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/health_svm_model.joblib']"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 随机森林",
   "id": "e1c25a8827d52c27"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:17:29.864707Z",
     "start_time": "2024-05-31T00:17:03.437743Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "rf_model = RandomForestClassifier()\n",
    "# 定义参数网格\n",
    "param_grid = {\n",
    "    'n_estimators': [1, 10, 15, 20, 30, 40, 50, 75, 100],  # 可以尝试的决策树数量\n",
    "    'max_depth': [i for i in range(2, 11)],  # 可以尝试的树的最大深度\n",
    "    'max_features': ['sqrt'],  # 可以尝试的特征选择方法\n",
    "}\n",
    "\n",
    "# 创建网格搜索对象\n",
    "grid_search = GridSearchCV(rf_model, param_grid, cv=5, scoring='f1')\n",
    "\n",
    "# 执行网格搜索\n",
    "grid_search.fit(X_train, y_train)"
   ],
   "id": "5861935a76cd1242",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={'max_depth': [2, 3, 4, 5, 6, 7, 8, 9, 10],\n",
       "                         'max_features': ['sqrt'],\n",
       "                         'n_estimators': [1, 10, 15, 20, 30, 40, 50, 75, 100]},\n",
       "             scoring='f1')"
      ],
      "text/html": [
       "<style>#sk-container-id-4 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-4 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-4 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-4 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-4 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-4 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={&#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9, 10],\n",
       "                         &#x27;max_features&#x27;: [&#x27;sqrt&#x27;],\n",
       "                         &#x27;n_estimators&#x27;: [1, 10, 15, 20, 30, 40, 50, 75, 100]},\n",
       "             scoring=&#x27;f1&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=5, estimator=RandomForestClassifier(),\n",
       "             param_grid={&#x27;max_depth&#x27;: [2, 3, 4, 5, 6, 7, 8, 9, 10],\n",
       "                         &#x27;max_features&#x27;: [&#x27;sqrt&#x27;],\n",
       "                         &#x27;n_estimators&#x27;: [1, 10, 15, 20, 30, 40, 50, 75, 100]},\n",
       "             scoring=&#x27;f1&#x27;)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" ><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: RandomForestClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_depth=10, n_estimators=1)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" ><label for=\"sk-estimator-id-12\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(max_depth=10, n_estimators=1)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:17:29.959480Z",
     "start_time": "2024-05-31T00:17:29.865714Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = grid_search.best_estimator_\n",
    "y_pred = model.predict(X_test)\n",
    "# 混淆矩阵\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "# 准确性\n",
    "accuracy = metrics.accuracy_score(y_test, y_pred)\n",
    "print(accuracy)\n",
    "# 精确性\n",
    "precision = metrics.precision_score(y_test, y_pred)\n",
    "print(precision)\n",
    "# 召回率\n",
    "recall = metrics.recall_score(y_test, y_pred)\n",
    "print(recall)\n",
    "# F1分数\n",
    "f1 = metrics.f1_score(y_test, y_pred)\n",
    "print(f1)\n",
    "# ROC曲线\n",
    "fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)\n",
    "plt.plot(fpr, tpr)\n",
    "plt.xlabel('FPR')\n",
    "plt.ylabel('TPR')\n",
    "plt.show()\n",
    "# AUC值\n",
    "auc = metrics.auc(fpr, tpr)\n",
    "auc"
   ],
   "id": "a1fb57b374b1852b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[907  33]\n",
      " [ 40   2]]\n",
      "0.9256619144602851\n",
      "0.05714285714285714\n",
      "0.047619047619047616\n",
      "0.05194805194805195\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.5062563323201622"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-31T00:17:29.990967Z",
     "start_time": "2024-05-31T00:17:29.960864Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from joblib import dump\n",
    "# 假设 model 是你已经训练好的模型\n",
    "# 保存模型到文件\n",
    "dump(model, './models/salary_models/health_RandomForestClassifier_model.joblib')"
   ],
   "id": "9aa33ab659722cea",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./models/models_save/health_RandomForestClassifier_model.joblib']"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
